/***********************************************************************************
 * 文件名： soft_uart.h
 * 版本�?1
 * 说明�?
 * 		软件模拟UART。提供单个字节发送和接收的基本功能，类似于常见MCU的基础UART外设。在头文
 *  件中查看 API 以及说明�?
 * 修改记录�?
 * 	2021/04/28: 初版�?刘言�?
***********************************************************************************/
#ifndef _SOFT_UART_H_
#define _SOFT_UART_H_

// 通过修改这里设置正确的配置头文件路径
#include "a-suart_config.h"
//#include "..\App\suart_config.h"

#include "polsys.h"

// SUART事件
typedef enum _suart_ev
{
    SUART_EV_NULL,
    SUART_EV_RX_DONE,  // 一个字节接收完�?
    SUART_EV_STOP_ERR, // 停止位电平错误（如果SUart_Event处理时间大于3个时钟周期，导致接收停止位时已经达到了下一个起始位，也会导致这个错误），下一次的高电平将会认为是空闲状�?
    SUART_EV_TX_DONE,  // 一个字节发送完�?
    _SUART_EV_END
} suart_ev_t;

// 为了伪函数代码优化暴露以下属�?

extern bit _SUart_Run;
extern volatile u8 _SUart_mRxBuff; // 接收缓存
extern volatile bit _SUart_mSending;

// API

// 定时器中断中调用，定时器中断频率�?1/3 就是波特率�?
void SUart_EvTimer();

// 初始化。端口和定时器。注意没有使能，需要调�?SUart_Enable �?SUart 才开始运行�?
#define SUart_Init()        \
    {                       \
        _SUart_InitPin();   \
        _SUart_InitTimer(); \
    }

// 关闭 SUART，可以降低CPU占用�?
#define SUart_Disable() _SUart_Run = false

// 开�?SUART
#define SUart_Enable() _SUart_Run = true

// 获取刚刚收到的一个字节，一般在收到 SUART_EV_RX_DONE 事件后调用�?
#define SUart_GetRxByte() _SUart_mRxBuff

// [异步]发送一个字�?
// 发送完成后会触�?SUART_EV_TX_DONE 事件（如果使能），也可以调用 SUart_GetTxFlag 查询发送状态�?
void SUart_SendByte(u8 byte);

// 获取（查询）发送状�?
// 1：发送中�?：发送完�?
#define SUart_GetTxFlag() _SUart_mSending

#endif
